package android_serialport_api;

import android.util.Log;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Iterator;
import java.util.Locale;
import java.util.Vector;

public class SerialPortFinder
{

	public class Driver
	{
		public Driver(String name, String root)
		{
			mDriverName = name;
			mDeviceRoot = root;
		}

		private String mDriverName;
		private String mDeviceRoot;
		Vector<File> mDevices = null;

		public Vector<File> getDevices()
		{
			if (mDevices == null)
			{
				mDevices = new Vector<File>();
				File dev = new File("/dev");
				File[] files = dev.listFiles();
				int i;
				for (i = 0; i < files.length; i++)
				{
					if (files[i].getAbsolutePath().startsWith(mDeviceRoot))
					{
						Log.d(TAG, "Found new device: " + files[i]);
						mDevices.add(files[i]);
					}
				}
			}
			return mDevices;
		}

		public String getName()
		{
			return mDriverName;
		}
	}

	private static final String TAG = "SerialPort";

	private Vector<Driver> mDrivers = null;

	Vector<Driver> getDrivers() throws IOException
	{
		if (mDrivers == null)
		{
			mDrivers = new Vector<Driver>();
			LineNumberReader r = new LineNumberReader(new FileReader(
					"/proc/tty/drivers"));
			String l;
			while ((l = r.readLine()) != null)
			{
				// Issue 3:
				// Since driver name may contain spaces, we do not extract
				// driver name with split()
				String drivername = l.substring(0, 0x15).trim();
				String[] w = l.split(" +");
				if ((w.length >= 5) && (w[w.length - 1].equals("serial")))
				{
					Log.d(TAG, "Found new driver " + drivername + " on "
							+ w[w.length - 4]);
					mDrivers.add(new Driver(drivername, w[w.length - 4]));
				}
			}
			r.close();
		}
		return mDrivers;
	}

	public String[] getAllDevices()
	{
		Vector<String> devices = new Vector<String>();
		// Parse each driver
		Iterator<Driver> itdriv;
		try
		{
			itdriv = getDrivers().iterator();
			while (itdriv.hasNext())
			{
				Driver driver = itdriv.next();
				Iterator<File> itdev = driver.getDevices().iterator();
				while (itdev.hasNext())
				{
					String device = itdev.next().getName();
					String value = String.format(Locale.US,"%s (%s)", device,
							driver.getName());
					devices.add(value);
				}
			}
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		return devices.toArray(new String[devices.size()]);
	}

	public String getHisensePrinterDevice(){
		String device = "ttySAC1";
		String[] devices = getAllDevices();
		if(devices != null && devices.length > 0){
			for(int i = 0; i < devices.length; i++){
				if(devices[i].startsWith(device)){
					return device;
				}
			}
		}
		return null;
	}

	public String[] getAllDevicesPath()
	{
		Vector<String> devices = new Vector<String>();
		// Parse each driver
		Iterator<Driver> itdriv;
		try
		{
			itdriv = getDrivers().iterator();
			while (itdriv.hasNext())
			{
				Driver driver = itdriv.next();
				Iterator<File> itdev = driver.getDevices().iterator();
				while (itdev.hasNext())
				{
					String device = itdev.next().getAbsolutePath();
					devices.add(device);
				}
			}
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		return devices.toArray(new String[devices.size()]);
	}
}
